/*
 * drv_ch423s.h
 *
 *  Created on: Jan 5, 2023
 *      Author: Administrator
 */

#ifndef BSP_DRV_CH423S_H_
#define BSP_DRV_CH423S_H_

#include "stm32l4xx.h"

#define SCL_H       LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_8)
#define SCL_L       LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_8)

#define SDA_H       LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_9)
#define SDA_L      	LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_9)



/*9个数码管的位定义。这是1个16bit的位段。
CH423S段和位序关系
DP G F E D C B A
 7 6 5 4 3 2 1 0
*/
#define LED_ZERO_BIT			(1<< 4)		//零	（数码管E段）
#define LED_STAB_BIT			(1<< 1)		//稳定	（数码管B段）
#define LED_HOLD_BIT			(1<< 2)		//计数	（数码管C段）
#define LED_ALL					(0x016)		//3个指示灯
#define LED_NONE				(0x0)


/*指示灯序号定义（配合结构体DISP中的led[]使用，如led[LED_ZERO]）
*/
#define LED_ZERO				LED_ZERO_BIT			
#define LED_STAB				LED_STAB_BIT			
#define LED_HOLD				LED_HOLD_BIT			


//#define LED_ZERO_BIT			(1<< 0)		//零
//#define LED_STABLE_BIT			(1<< 1)		//稳定
//#define LED_PCS_BIT				(1<< 2)		//计数
//#define LED_NET_BIT				(1<< 3)		//净重
//#define LED_TOTAL_BIT			(1<< 4)		//累加
//#define LED_BAT_BIT				(1<< 5)		//电池
//#define LED_KG_BIT				(1<< 6)		//单位KG
//#define LED_G_BIT				(1<< 7)		//单位G
//#define LED_LB_BIT				(1<< 8)		//单位LB
//#define LED_ALL					(0x01FF)
//#define LED_NONE				(0x0)

#define DOT_EN					1				//使能小数点
#define DOT_DIS					0				//禁止小数点


#define CMD_WR_DIG0     		0x60
#define CMD_WR_DIG1     		0x60+(1<< 1)
#define CMD_WR_DIG2     		0x60+(2<< 1)
#define CMD_WR_DIG3     		0x60+(3<< 1)
#define CMD_WR_DIG4     		0x60+(4<< 1)
#define CMD_WR_DIG5     		0x60+(5<< 1)
#define CMD_WR_DIG6     		0x60+(6<< 1)
#define CMD_WR_DIG7     		0x60+(7<< 1)
#define CMD_WR_DIG8     		0x60+(8<< 1)
#define CMD_WR_DIG9     		0x60+(9<< 1)
#define CMD_WR_DIG10    		0x60+(10<< 1)
#define CMD_WR_DIG11    		0x60+(11<< 1)
#define CMD_WR_DIG12    		0x60+(12<< 1)
#define CMD_WR_DIG13    		0x60+(13<< 1)
#define CMD_WR_DIG14    		0x60+(14<< 1)
#define CMD_WR_DIG15    		0x60+(15<< 1)

//0.56"数码管对应的0~9。
#define DAT_0           		0x3F        //数码管显示0时，需要写入的字段序列。
#define DAT_1           		0x06
#define DAT_2           		0x5B
#define DAT_3           		0x4F
#define DAT_4           		0x66
#define DAT_5           		0x6D
#define DAT_6           		0x7D
#define DAT_7           		0x07
#define DAT_8           		0x7F
#define DAT_9           		0x6F
#define DAT_DOT         		0x80        //0.56"数码管的小数点
#define DAT_MINUS       		0x40        //'-'负号
#define DAT_BLANK       		0x0
#define DAT_X       			0x08		//不存在

#define DAT_F					0x71		//'F'
#define DAT_o					0x5C		//'o'
#define DAT_r					0x50		//'r'
#define DAT_C					0x39		//'C'
#define DAT_E					0x79		//'E'


//0.39"数码管对应的0~9。（因为封装和实物不符，好像是Y轴反了。
#define DAT_0_S         		0xED
#define DAT_1_S         		0x21
#define DAT_2_S         		0xF4
#define DAT_3_S         		0xF1
#define DAT_4_S         		0x39
#define DAT_5_S         		0xD9
#define DAT_6_S         		0xDD
#define DAT_7_S         		0x61
#define DAT_8_S         		0xFD
#define DAT_9_S         		0xF9
#define DAT_DOT_S       		0x02        //0.39"数码管的小数点
#define DAT_MINUS_S     		0x10        //'-'负号
#define DAT_BLANK_S     		0x0


#define DISP_X_MODE_NORM		0x0			//正常
#define DISP_X_MODE_ON			0x0			//常亮
#define DISP_X_MODE_OFF			0x01		//常灭
#define DISP_X_MODE_FF			0x02		//快闪:Fast Flash
#define DISP_X_MODE_LF			0x03		//慢闪:Slow Flash







/*数码管序号定义（这样不在犹豫左起第1个是0还是1）
*/
#define SEG_L_1					0			//左起第1个数码管。
#define SEG_L_2					1			//左起第1个数码管。
#define SEG_L_3					2			//左起第1个数码管。
#define SEG_L_4					3			//左起第1个数码管。
#define SEG_L_5					4			//左起第1个数码管。
#define SEG_L_6					5			//左起第1个数码管。



/*Ð¡ÊýµãÐòºÅ¶¨Òå£¨ÕâÑù²»ÔÚÓÌÔ¥×óÆðµÚ1¸öÊÇ0»¹ÊÇ1£©
*/
#define PT_L_1					0			//×óÆðµÚ1¸öÊýÂë¹Ü¡£
#define PT_L_2					1			//×óÆðµÚ2¸öÊýÂë¹Ü¡£
#define PT_L_3					2			//×óÆðµÚ3¸öÊýÂë¹Ü¡£
#define PT_L_4					3			//×óÆðµÚ4¸öÊýÂë¹Ü¡£
#define PT_L_5					4			//×óÆðµÚ5¸öÊýÂë¹Ü¡£
#define PT_L_6					5			//×óÆðµÚ6¸öÊýÂë¹Ü£¬Ó¦²»ÏÔÊ¾¸ÃÎ»µÄÐ¡Êýµã¡£



/*面板上1个指示灯对应的结构体。
*/
typedef struct _LED_X{
	uint8_t mode;
	uint8_t sta;
	uint8_t cnt;
	uint8_t max;
}LED_X;



/*
*/
typedef struct _DISP{
	uint32_t ts;					//时间戳
	uint8_t data[8];				//对应8个数码管的寄存器值（当前值，写入值，用于内部变换），前6个[0,5]是数码管，后2个[6,7]是9个LED。
	uint8_t data_nc[8];				//由外部输入的值，不被内部变化更改，只由外部写入时更新。一般用于数码管闪。
	uint8_t data_char[8];			//显示的字符值和小数点（|0x80，MSB为小数点，低7位为字符值，需要转换为data[])。
	//char str[12+1];					//6个数码管要显示的内容。
	uint8_t mode[6];				//显示模式，6个数码管+9个LED。
	uint8_t sta[6];					//状态（配合显示模式中的快闪或慢闪的亮-灭切换）。
	uint8_t cnt_seg;				//数码管和非电池指示灯的快闪，慢闪时的计数。
	uint8_t max_seg;				//计数器计数最大值，超过此值翻转为0。	
	
	LED_X led[9];					//数组写法，便于for()处理。
//	LED_X led_zero;
//	LED_X led_stable;
//	LED_X led_pcs;
//	LED_X led_net;
//	LED_X led_sigma;
//	LED_X led_bat;
//	LED_X led_unit_kg;
//	LED_X led_unit_g;
//	LED_X led_unit_lb;				//分别定义，表达意思清晰，但不利于for()处理。QQ指针。
}DISP;


extern DISP disp_x;

//    ch423s_set(CMD_WR_DIG5, 0x3F);    //0
//    ch423s_set(CMD_WR_DIG6, 0x0C);    //1
//    ch423s_set(CMD_WR_DIG7, 0x5B);    //2
//    ch423s_set(CMD_WR_DIG8, 0x5E);    //3
//    ch423s_set(CMD_WR_DIG9, 0x6C);    //4
//    ch423s_set(CMD_WR_DIG10, 0x76);   //5
//    ch423s_set(CMD_WR_DIG11, 0x77);   //6
//    ch423s_set(CMD_WR_DIG12, 0x1C);   //7
//    ch423s_set(CMD_WR_DIG11, 0x7F);   //8
//    ch423s_set(CMD_WR_DIG12, 0x7E);   //9
void ch423s_init(void);
void ch423s_disp(uint16_t* p);
void ch423s_disp_minus(void);
void ch423s_set(uint8_t cmd, uint8_t data, uint16_t dot);
uint8_t ch423s_get(uint8_t addr, uint8_t* p);
int32_t ch423s_update(uint8_t* p);

int32_t x_disp_now(char* str, uint32_t sta, uint16_t mask);

uint8_t char_to_disp(char ch);




/*数码管底层函数，和bsp_gpio.h中相同，增加前缀‘x_’。
把显示屏（数码管+LED）想象为点阵。下面的函数可以针对某些点阵进行直接操作，如，
设置某个数码管/seg的是否显示小数点；
设置某个数码管的显示内容；
设置某个数码管的显示模式：灭-快闪-慢闪。
设置某只指示灯/led的显示；
设置某只指示灯的显示模式：灭-快闪-慢闪。
...
*/
void x_seg_one_flash(uint32_t idx, uint8_t mode);
void x_seg_flash_all(uint32_t en);

int32_t x_seg_set_one_content(uint8_t idx, uint8_t ch, uint8_t dot);
int32_t x_seg_set_point(uint8_t idx, uint8_t dot);

int32_t x_seg_inc_one(uint32_t idx);		
int32_t x_seg_dec_one(uint32_t idx);		

int32_t x_seg_get_val(const char* pstr);

void x_seg_copy_to_tmp(char* p);
void x_seg_copy_from_tmp(char* p);

void x_led_one_flash(uint32_t idx, uint8_t mode);

#endif /* BSP_DRV_CH423S_H_ */
